package com.aiwiown.snackmq.console.config;

import com.aiwiown.snackmq.console.auth.SnackMQAuthenticationProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * Spring Security 的核心配置类。
 */
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    private final SnackMQAuthenticationProvider snackMQAuthenticationProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 使用自定义的 AuthenticationProvider，它会调用 SnackMQAdminService 进行认证
        auth.authenticationProvider(snackMQAuthenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable() // 禁用 CSRF 防护，以解决所有 POST 请求的 403 Forbidden 问题
                .authorizeRequests()
                // 允许访问静态资源和登录页面
                .antMatchers("/css/**", "/js/**", "/img/**", "/login").permitAll()
                // 所有其他请求都需要认证
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login") // 指定登录页面
                .defaultSuccessUrl("/", true) // 登录成功后重定向到主页
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout") // 注销成功后重定向
                .permitAll();
    }
}
